// var i;
// var c;
// var s = cc._decorator;
// var l = s.ccclass;
// var u = s.property;
// var d = s.disallowMultiple;
// var p = s.menu;
// var h = s.executionOrder;
// !(function (e) {
//     e[(e.NONE = 0)] = "NONE";
//     e[(e.TOGGLE = 1)] = "TOGGLE";
//     e[(e.SWITCH = 2)] = "SWITCH";
// })(c || (c = {}));
// var f = (function (e) {
//     function t() {
//         var t = (null !== e && e.apply(this, arguments)) || this;
//         t.icon = null;
//         t.title = null;
//         t.selectedMode = c.NONE;
//         t.selectedFlag = null;
//         t.selectedSpriteFrame = null;
//         t._unselectedSpriteFrame = null;
//         t.adaptiveSize = !1;
//         t._selected = !1;
//         t._eventReg = !1;
//         return t;
//     }
//     __extends(t, e);
//     Object.defineProperty(t.prototype, "selected", {
//         get: function () {
//             return this._selected;
//         },
//         set: function (e) {
//             this._selected = e;
//             if (this.selectedFlag) {
//                 switch (this.selectedMode) {
//                     case c.TOGGLE:
//                         this.selectedFlag.active = e;
//                         break;
//                     case c.SWITCH:
//                         var t = this.selectedFlag.getComponent(cc.Sprite);
//                         if (t) {
//                             t.spriteFrame = e ? this.selectedSpriteFrame : this._unselectedSpriteFrame;
//                         }
//                 }
//             }
//         },
//         enumerable: !1,
//         configurable: !0
//     });
//     Object.defineProperty(t.prototype, "btnCom", {
//         get: function () {
//             if (!this._btnCom) {
//                 this._btnCom = this.node.getComponent(cc.Button);
//             }
//             return this._btnCom;
//         },
//         enumerable: !1,
//         configurable: !0
//     });
//     t.prototype.onLoad = function () {
//         if (this.selectedMode == c.SWITCH) {
//             var e = this.selectedFlag.getComponent(cc.Sprite);
//             this._unselectedSpriteFrame = e.spriteFrame;
//         }
//     };
//     t.prototype.onDestroy = function () {
//         this.node.off(cc.Node.EventType.SIZE_CHANGED, this._onSizeChange, this);
//     };
//     t.prototype._registerEvent = function () {
//         if (!this._eventReg) {
//             if (this.btnCom && this.list.selectedMode > 0) {
//                 this.btnCom.clickEvents.unshift(this.createEvt(this, "onClickThis"));
//             }
//             if (this.adaptiveSize) {
//                 this.node.on(cc.Node.EventType.SIZE_CHANGED, this._onSizeChange, this);
//             }
//             this._eventReg = !0;
//         }
//     };
//     t.prototype._onSizeChange = function () {
//         this.list._onItemAdaptive(this.node);
//     };
//     t.prototype.createEvt = function (e, t, o) {
//         if (void 0 === o) {
//             o = null;
//         }
//         if (e.isValid) {
//             e.comName =
//                 e.comName ||
//                 e.name
//                     .match(/\<(.*?)\>/g)
//                     .pop()
//                     .replace(/\<|>/g, "");
//             var n = new cc.Component.EventHandler();
//             n.target = o || e.node;
//             n.component = e.comName;
//             n.handler = t;
//             return n;
//         }
//     };
//     t.prototype.showAni = function (e, t, o) {
//         var n;
//         var i = this;
//         switch (e) {
//             case 0:
//                 n = cc
//                     .tween(i.node)
//                     .to(0.2, {
//                         scale: 0.7
//                     })
//                     .by(0.3, {
//                         y: 2 * i.node.height
//                     });
//                 break;
//             case 1:
//                 n = cc
//                     .tween(i.node)
//                     .to(0.2, {
//                         scale: 0.7
//                     })
//                     .by(0.3, {
//                         x: 2 * i.node.width
//                     });
//                 break;
//             case 2:
//                 n = cc
//                     .tween(i.node)
//                     .to(0.2, {
//                         scale: 0.7
//                     })
//                     .by(0.3, {
//                         y: -2 * i.node.height
//                     });
//                 break;
//             case 3:
//                 n = cc
//                     .tween(i.node)
//                     .to(0.2, {
//                         scale: 0.7
//                     })
//                     .by(0.3, {
//                         x: -2 * i.node.width
//                     });
//                 break;
//             default:
//                 n = cc.tween(i.node).to(0.3, {
//                     scale: 0.1
//                 });
//         }
//         if (t || o) {
//             n.call(function () {
//                 if (o) {
//                     i.list._delSingleItem(i.node);
//                     for (var e = i.list.displayData.length - 1; e >= 0; e--) {
//                         if (i.list.displayData[e].id == i.listId) {
//                             i.list.displayData.splice(e, 1);
//                             break;
//                         }
//                     }
//                 }
//                 t();
//             });
//         }
//         n.start();
//     };
//     t.prototype.onClickThis = function () {
//         this.list.selectedId = this.listId;
//     };
//     __decorate(
//         [
//             u({
//                 type: cc.Sprite
//             })
//         ],
//         t.prototype,
//         "icon",
//         void 0
//     );
//     __decorate(
//         [
//             u({
//                 type: cc.Node
//             })
//         ],
//         t.prototype,
//         "title",
//         void 0
//     );
//     __decorate(
//         [
//             u({
//                 type: cc.Enum(c)
//             })
//         ],
//         t.prototype,
//         "selectedMode",
//         void 0
//     );
//     __decorate(
//         [
//             u({
//                 type: cc.Node,
//                 visible: function () {
//                     return this.selectedMode > c.NONE;
//                 }
//             })
//         ],
//         t.prototype,
//         "selectedFlag",
//         void 0
//     );
//     __decorate(
//         [
//             u({
//                 type: cc.SpriteFrame,
//                 visible: function () {
//                     return this.selectedMode == c.SWITCH;
//                 }
//             })
//         ],
//         t.prototype,
//         "selectedSpriteFrame",
//         void 0
//     );
//     __decorate([u({})], t.prototype, "adaptiveSize", void 0);
//     return __decorate([l, d(), p("UI组件/List Item"), h(-5001)], t);
// })(cc.Component);
// exports.default = f;


// const { ccclass, property, disallowMultiple, menu, executionOrder } = cc._decorator;

// /**
//  * 枚举类型，表示选择模式
//  * 建议名称：SelectionMode
//  */
// enum SelectionMode {
//     NONE = 0,
//     TOGGLE = 1,
//     SWITCH = 2
// }

// /**
//  * 列表项组件类
//  * 建议名称：ListItemComponent
//  */
// @ccclass
// @disallowMultiple()
// @menu("UI组件/List Item")
// @executionOrder(-5001)
// class ListItem extends cc.Component {
//     /** 图标 */
//     @property(cc.Sprite)
//     public icon: cc.Sprite = null;

//     /** 标题 */
//     @property(cc.Node)
//     public title: cc.Node = null;

//     /** 选择模式 */
//     @property({ type: cc.Enum(SelectionMode) })
//     public selectedMode: SelectionMode = SelectionMode.NONE;

//     /** 选择标志 */
//     @property({
//         type: cc.Node,
//         visible() {
//             return this.selectedMode > SelectionMode.NONE;
//         }
//     })
//     public selectedFlag: cc.Node = null;

//     /** 选择的精灵帧 */
//     @property({
//         type: cc.SpriteFrame,
//         visible() {
//             return this.selectedMode === SelectionMode.SWITCH;
//         }
//     })
//     public selectedSpriteFrame: cc.SpriteFrame = null;

//     /** 自适应大小 */
//     @property
//     public adaptiveSize: boolean = false;

//     private _unselectedSpriteFrame: cc.SpriteFrame = null;
//     private _selected: boolean = false;
//     private _eventReg: boolean = false;
//     private _btnCom: cc.Button = null;

//     /** 列表引用 */
//     public list: any = null;

//     /** 列表项ID */
//     public listId: number = null;

//     /**
//      * 获取是否选中
//      * 建议名称：isSelected
//      */
//     get selected(): boolean {
//         return this._selected;
//     }

//     /**
//      * 设置是否选中
//      * 建议名称：setSelected
//      */
//     set selected(value: boolean) {
//         this._selected = value;
//         if (this.selectedFlag) {
//             switch (this.selectedMode) {
//                 case SelectionMode.TOGGLE:
//                     this.selectedFlag.active = value;
//                     break;
//                 case SelectionMode.SWITCH:
//                     const sprite = this.selectedFlag.getComponent(cc.Sprite);
//                     if (sprite) {
//                         sprite.spriteFrame = value ? this.selectedSpriteFrame : this._unselectedSpriteFrame;
//                     }
//                     break;
//             }
//         }
//     }

//     /**
//      * 获取按钮组件
//      * 建议名称：getButtonComponent
//      */
//     get btnCom(): cc.Button {
//         if (!this._btnCom) {
//             this._btnCom = this.node.getComponent(cc.Button);
//         }
//         return this._btnCom;
//     }

//     /**
//      * 加载时调用
//      * 建议名称：onComponentLoad
//      */
//     onLoad() {
//         if (this.selectedMode === SelectionMode.SWITCH) {
//             const sprite = this.selectedFlag.getComponent(cc.Sprite);
//             this._unselectedSpriteFrame = sprite.spriteFrame;
//         }
//     }

//     /**
//      * 销毁时调用
//      * 建议名称：onComponentDestroy
//      */
//     onDestroy() {
//         this.node.off(cc.Node.EventType.SIZE_CHANGED, this._onSizeChange, this);
//     }

//     /**
//      * 注册事件
//      * 建议名称：registerEvent
//      */
//      _registerEvent() {
//         if (!this._eventReg) {
//             if (this.btnCom && this.list.selectedMode > 0) {
//                 this.btnCom.clickEvents.unshift(this.createEvt(this, "onClickThis"));
//             }
//             if (this.adaptiveSize) {
//                 this.node.on(cc.Node.EventType.SIZE_CHANGED, this._onSizeChange, this);
//             }
//             this._eventReg = true;
//         }
//     }

//     /**
//      * 尺寸变化时调用
//      * 建议名称：onSizeChange
//      */
//     private _onSizeChange() {
//         this.list._onItemAdaptive(this.node);
//     }

//     /**
//      * 创建事件
//      * 建议名称：createEvent
//      */
//     private createEvt(target: any, handler: string, node: cc.Node = null): cc.Component.EventHandler {
//         if (target.isValid) {
//             target.comName = target.comName || target.name.match(/\<(.*?)\>/g).pop().replace(/\<|>/g, "");
//             const eventHandler = new cc.Component.EventHandler();
//             eventHandler.target = node || target.node;
//             eventHandler.component = target.comName;
//             eventHandler.handler = handler;
//             return eventHandler;
//         }
//     }

//     /**
//      * 显示动画
//      * 建议名称：showAnimation
//      */
//     public showAni(type: number, callback?: Function, remove?: boolean) {
//         let tween: cc.Tween;
//         const node = this.node;
//         switch (type) {
//             case 0:
//                 tween = cc.tween(node).to(0.2, { scale: 0.7 }).by(0.3, { y: 2 * node.height });
//                 break;
//             case 1:
//                 tween = cc.tween(node).to(0.2, { scale: 0.7 }).by(0.3, { x: 2 * node.width });
//                 break;
//             case 2:
//                 tween = cc.tween(node).to(0.2, { scale: 0.7 }).by(0.3, { y: -2 * node.height });
//                 break;
//             case 3:
//                 tween = cc.tween(node).to(0.2, { scale: 0.7 }).by(0.3, { x: -2 * node.width });
//                 break;
//             default:
//                 tween = cc.tween(node).to(0.3, { scale: 0.1 });
//         }
//         if (callback || remove) {
//             tween.call(() => {
//                 if (remove) {
//                     this.list._delSingleItem(node);
//                     for (let i = this.list.displayData.length - 1; i >= 0; i--) {
//                         if (this.list.displayData[i].id === this.listId) {
//                             this.list.displayData.splice(i, 1);
//                             break;
//                         }
//                     }
//                 }
//                 callback && callback();
//             });
//         }
//         tween.start();
//     }

//     /**
//      * 点击事件处理
//      * 建议名称：onClick
//      */
//     public onClickThis() {
//         this.list.selectedId = this.listId;
//     }
// }

// export default ListItem;

const { ccclass, property, disallowMultiple, menu, executionOrder } = cc._decorator;

/**
 * 枚举类型，表示选择模式
 * 建议名称：SelectionMode
 */
enum SelectionMode {
    NONE = 0,
    TOGGLE = 1,
    SWITCH = 2
}

/**
 * 列表项组件类
 * 建议名称：ListItemComponent
 */
@ccclass
@disallowMultiple()
@menu("UI组件/List Item")
@executionOrder(-5001)
class ListItem extends cc.Component {
    /** 图标 */
    @property(cc.Sprite)
    public icon: cc.Sprite = null;

    /** 标题 */
    @property(cc.Node)
    public title: cc.Node = null;

    /** 选择模式 */
    @property({ type: cc.Enum(SelectionMode) })
    public selectedMode: SelectionMode = SelectionMode.NONE;

    /** 选择标志 */
    @property({
        type: cc.Node,
        visible() {
            return this.selectedMode > SelectionMode.NONE;
        }
    })
    public selectedFlag: cc.Node = null;

    /** 选择的精灵帧 */
    @property({
        type: cc.SpriteFrame,
        visible() {
            return this.selectedMode === SelectionMode.SWITCH;
        }
    })
    public selectedSpriteFrame: cc.SpriteFrame = null;

    /** 自适应大小 */
    @property
    public adaptiveSize: boolean = false;

    private _unselectedSpriteFrame: cc.SpriteFrame = null;
    private _isSelected: boolean = false;
    private _isEventRegistered: boolean = false;
    private _buttonComponent: cc.Button = null;

    /** 列表引用 */
    public list: any = null;

    /** 列表项ID */
    public listId: number = null;

    /**
     * 获取是否选中
     * 建议名称：isSelected
     */
    get selected(): boolean {
        return this._isSelected;
    }

    /**
     * 设置是否选中
     * 建议名称：setSelected
     */
    set selected(value: boolean) {
        this._isSelected = value;
        if (this.selectedFlag) {
            switch (this.selectedMode) {
                case SelectionMode.TOGGLE:
                    this.selectedFlag.active = value;
                    break;
                case SelectionMode.SWITCH:
                    const sprite = this.selectedFlag.getComponent(cc.Sprite);
                    if (sprite) {
                        sprite.spriteFrame = value ? this.selectedSpriteFrame : this._unselectedSpriteFrame;
                    }
                    break;
            }
        }
    }

    /**
     * 获取按钮组件
     * 建议名称：getButtonComponent
     */
    get btnCom(): cc.Button {
        if (!this._buttonComponent) {
            this._buttonComponent = this.node.getComponent(cc.Button);
        }
        return this._buttonComponent;
    }

    /**
     * 加载时调用
     * 建议名称：onComponentLoad
     */
    onLoad() {
        if (this.selectedMode === SelectionMode.SWITCH) {
            const sprite = this.selectedFlag.getComponent(cc.Sprite);
            this._unselectedSpriteFrame = sprite.spriteFrame;
        }
    }

    /**
     * 销毁时调用
     * 建议名称：onComponentDestroy
     */
    onDestroy() {
        this.node.off(cc.Node.EventType.SIZE_CHANGED, this._onSizeChange, this);
    }

    /**
     * 注册事件
     * 建议名称：registerEvent
     */
    registerEvent() {
        if (!this._isEventRegistered) {
            if (this.btnCom && this.list.selectedMode > 0) {
                this.btnCom.clickEvents.unshift(this.createEvent(this, "onClickThis"));
            }
            if (this.adaptiveSize) {
                this.node.on(cc.Node.EventType.SIZE_CHANGED, this._onSizeChange, this);
            }
            this._isEventRegistered = true;
        }
    }

    /**
     * 尺寸变化时调用
     * 建议名称：onSizeChange
     */
    private _onSizeChange() {
        this.list._onItemAdaptive(this.node);
    }

    /**
     * 创建事件
     * 建议名称：createEvent
     */
    private createEvent(target: any, handler: string, node: cc.Node = null): cc.Component.EventHandler {
        if (target.isValid) {
            target.comName = target.comName || target.name.match(/\<(.*?)\>/g).pop().replace(/\<|>/g, "");
            const eventHandler = new cc.Component.EventHandler();
            eventHandler.target = node || target.node;
            eventHandler.component = target.comName;
            eventHandler.handler = handler;
            return eventHandler;
        }
    }

    /**
     * 显示动画
     * 建议名称：showAnimation
     */
    public showAnimation(animationType: number, callback?: Function, removeItem?: boolean) {
        let tween: cc.Tween;
        const node = this.node;
        switch (animationType) {
            case 0:
                tween = cc.tween(node).to(0.2, { scale: 0.7 }).by(0.3, { y: 2 * node.height });
                break;
            case 1:
                tween = cc.tween(node).to(0.2, { scale: 0.7 }).by(0.3, { x: 2 * node.width });
                break;
            case 2:
                tween = cc.tween(node).to(0.2, { scale: 0.7 }).by(0.3, { y: -2 * node.height });
                break;
            case 3:
                tween = cc.tween(node).to(0.2, { scale: 0.7 }).by(0.3, { x: -2 * node.width });
                break;
            default:
                tween = cc.tween(node).to(0.3, { scale: 0.1 });
        }
        if (callback || removeItem) {
            tween.call(() => {
                if (removeItem) {
                    this.list._delSingleItem(node);
                    for (let i = this.list.displayData.length - 1; i >= 0; i--) {
                        if (this.list.displayData[i].id === this.listId) {
                            this.list.displayData.splice(i, 1);
                            break;
                        }
                    }
                }
                callback && callback();
            });
        }
        tween.start();
    }

    /**
     * 点击事件处理
     * 建议名称：onClick
     */
    public onClickThis() {
        this.list.selectedId = this.listId;
    }
}

export default ListItem;